home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / dev / c / MemPools1_2.lha / mempools / TimeMem.c < prev    next >
C/C++ Source or Header  |  1995-05-02  |  5KB  |  225 lines

  1. /**
  2. ***  MemPools:  malloc() replacement using standard Amiga pool functions.
  3. ***  Copyright  (C)  1994    Jochen Wiedmann
  4. ***
  5. ***  This program is free software; you can redistribute it and/or modify
  6. ***  it under the terms of the GNU General Public License as published by
  7. ***  the Free Software Foundation; either version 2 of the License, or
  8. ***  (at your option) any later version.
  9. ***
  10. ***  This program is distributed in the hope that it will be useful,
  11. ***  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ***  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ***  GNU General Public License for more details.
  14. ***
  15. ***  You should have received a copy of the GNU General Public License
  16. ***  along with this program; if not, write to the Free Software
  17. ***  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ***
  19. ***
  20. ***  This is a very simple timing and test program for the memory
  21. ***  functions of stdlib.h.
  22. ***
  23. ***
  24. ***  Computer:  Amiga 1200
  25. ***
  26. ***  Compilers: Dice 3.01
  27. ***             SAS/C 6.3
  28. ***             gcc 2.6.1
  29. ***
  30. ***
  31. ***  Author:    Jochen Wiedmann
  32. ***             Am Eisteich 9
  33. ***       72555 Metzingen
  34. ***             Germany
  35. ***
  36. ***             Phone: (0049) 7123 14881
  37. ***             Internet: jochen.wiedmann@uni-tuebingen.de
  38. **/
  39.  
  40.  
  41.  
  42.  
  43. /*
  44.     Include files and compiler specific stuff
  45. */
  46. #include <stdlib.h>
  47. #include <stdio.h>
  48. #include <string.h>
  49.  
  50. #ifndef FALSE
  51. #define FALSE 0
  52. #endif
  53. #ifndef TRUE
  54. #define TRUE (!FALSE)
  55. #endif
  56.  
  57. #if defined(__GNUC__)
  58. #define stricmp strcasecmp
  59. #define strnicmp strncasecmp
  60. #endif
  61.  
  62.  
  63.  
  64.  
  65.  
  66. /**
  67. ***  It is important that these numbers are powers of 2, as
  68. ***  they are used as arguments for rangerand()!
  69. **/
  70. #define NUMALLOCS 8192
  71. #define MAXSIZE 128
  72.  
  73.  
  74.  
  75. int rangerand(int max)
  76.  
  77. { int result = rand();
  78.  
  79.   while(result >= max)
  80.   { result = result >> 1;
  81.   }
  82.   return(result);
  83. }
  84.  
  85.  
  86. typedef void *APTR;
  87.  
  88.  
  89.  
  90. int __MemPoolPuddleSize = 16384;
  91.  
  92.  
  93. int main(int argc, char *argv[])
  94.  
  95. #ifdef DEBUG
  96. { char *ptr;
  97.  
  98.   if (!(ptr = malloc(6)))
  99.   { fprintf(stderr, "Cannot allocate memory.\n");
  100.     exit(20);
  101.   }
  102.  
  103.   if (argc > 1)
  104.   { fprintf(stderr, "Checking library: Freeing buffer twice.\n");
  105.     free(ptr);
  106.     free(ptr);
  107.   }
  108.   else
  109.   { fprintf(stderr, "Checking library: Extending array boundaries.\n");
  110.     ptr[7] = '\0';
  111.     free(ptr);
  112.   }
  113.  
  114.   fprintf(stderr, "Library check failed: free() returned.\n");
  115.   fprintf(stderr, "Be sure, that library is compiled with -DDEBUG.\n");
  116.   exit(10);
  117. }
  118. #else
  119. { int i, j;
  120.   int malloc_cnt = 0, calloc_cnt = 0, realloc_cnt = 0;
  121.   int malloc_free = 0, calloc_free = 0, realloc_free = 0;
  122.   APTR *malloc_table;
  123.   APTR *calloc_table;
  124.   APTR *realloc_table;
  125.   int VerboseMode = FALSE;
  126.    
  127.   srand(27);
  128.  
  129.   for (i = 1;  i < argc;  i++)
  130.   { if ((stricmp(argv[i], "?") == 0       ||
  131.      stricmp(argv[i], "help") == 0    ||
  132.      stricmp(argv[i], "-h") == 0))
  133.     { printf("Usage: TimeMem [VERBOSE}\n");
  134.       exit(5);
  135.     }
  136.     if (stricmp(argv[i], "verbose") == 0    ||
  137.     stricmp(argv[i], "-v") == 0)
  138.     { VerboseMode = TRUE;
  139.     }
  140.     else
  141.     { fprintf(stderr, "Unknown option: %s\n", argv[i]);
  142.     }
  143.   }
  144.  
  145.   if (!(malloc_table = calloc(NUMALLOCS, sizeof(APTR)))  ||
  146.       !(calloc_table = calloc(NUMALLOCS, sizeof(APTR)))  ||
  147.       !(realloc_table = calloc(NUMALLOCS, sizeof(APTR))))
  148.   { perror("malloc");
  149.   }
  150.  
  151.   for (i = 0;  i < NUMALLOCS;  i++)
  152.   {
  153.     /**
  154.     ***  Call malloc()
  155.     **/
  156.     if (!(malloc_table[i] = malloc(rangerand(MAXSIZE)+1)))
  157.     { perror("malloc");
  158.       exit(10);
  159.     }
  160.     malloc_cnt++;
  161.  
  162.     /**
  163.     ***  Call calloc()
  164.     **/
  165.     if (!(calloc_table[i] = calloc(rangerand(MAXSIZE)+1, 1)))
  166.     { perror("calloc");
  167.       exit(10);
  168.     }
  169.     calloc_cnt++;
  170.  
  171.     /**
  172.     ***  Call realloc()
  173.     **/
  174.     j = rangerand(NUMALLOCS);
  175.     if (!(realloc_table[j] = realloc(realloc_table[j], rangerand(MAXSIZE)+1)))
  176.     { perror("malloc");
  177.       exit(10);
  178.     }
  179.     realloc_cnt++;
  180.  
  181.     /**
  182.     ***  Free a block of memory obtained with malloc().
  183.     **/
  184.     j = rangerand(NUMALLOCS);
  185.     if (malloc_table[j])
  186.     { free(malloc_table[j]);
  187.       malloc_table[j] = NULL;
  188.       malloc_free++;
  189.     }
  190.  
  191.     /**
  192.     ***  Free a block of memory obtained with calloc().
  193.     **/
  194.     j = rangerand(NUMALLOCS);
  195.     if (calloc_table[j])
  196.     { free(calloc_table[j]);
  197.       calloc_table[j] = NULL;
  198.       calloc_free++;
  199.     }
  200.  
  201.     /**
  202.     ***  Free a block of memory obtained with realloc().
  203.     **/
  204.     j = rangerand(NUMALLOCS);
  205.     if (realloc_table[j])
  206.     { free(realloc_table[j]);
  207.       realloc_table[j] = NULL;
  208.       realloc_free++;
  209.     }
  210.   }
  211.  
  212.   if (VerboseMode)
  213.   { printf("TimeMem statistics:\n\n");
  214.     printf("Calls to malloc(): %d\n", malloc_cnt);
  215.     printf("Calls to calloc(): %d\n", calloc_cnt);
  216.     printf("Calls to realloc(): %d\n", realloc_cnt);
  217.     printf("Calls to free() for blocks obtained by malloc(): %d\n", malloc_free);
  218.     printf("Calls to free() for blocks obtained by calloc(): %d\n", calloc_free);
  219.     printf("Calls to free() for blocks obtained by realloc(): %d\n", realloc_free);
  220.   }
  221.  
  222.   exit(0);
  223. }
  224. #endif
  225.